package com.itheima.w_util;

import freemarker.template.Configuration;
import freemarker.template.Template;   
import freemarker.template.TemplateException;   
import freemarker.template.TemplateExceptionHandler;   
import java.io.File;   
import java.io.FileWriter;   
import java.io.IOException;   
import java.io.StringWriter;   
import java.nio.charset.StandardCharsets;   
import java.util.Map;
   
/**
   * Freemarker模板工具类
   */   
public class FreemarkerUtil {

    private static Configuration cfg;

    static {
        try {
            // 初始化Freemarker配置
            cfg = new Configuration();
            // 设置模板加载路径（这里设置为从classpath加载）
            cfg.setClassForTemplateLoading(FreemarkerUtil.class, "/templates");
            cfg.setDefaultEncoding(StandardCharsets.UTF_8.name());
            cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
            cfg.setLogTemplateExceptions(false);
            cfg.setWrapUncheckedExceptions(true);
            cfg.setFallbackOnNullLoopVariable(false);
        } catch (Exception e) {
            throw new RuntimeException("初始化Freemarker配置失败", e);
        }
    }

    /**
     * 渲染模板到字符串
     * @param templateName 模板名称
     * @param dataModel 数据模型
     * @return 渲染结果字符串
     */
    public static String renderToString(String templateName, Map<String, Object> dataModel) {
        try (StringWriter writer = new StringWriter()) {
            Template template = cfg.getTemplate(templateName);
            template.process(dataModel, writer);
            return writer.toString();
        } catch (IOException | TemplateException e) {
            e.printStackTrace();
            throw new RuntimeException("渲染模板失败: " + templateName, e);
        }
    }

    /**
     * 渲染模板到文件
     * @param templateName 模板名称
     * @param dataModel 数据模型
     * @param outputFile 输出文件
     */
    public static void renderToFile(String templateName, Map<String, Object> dataModel, File outputFile) {
        // 确保目录存在
        File parentDir = outputFile.getParentFile();
        if (parentDir != null && !parentDir.exists()) {
            parentDir.mkdirs();
        }

        try (FileWriter writer = new FileWriter(outputFile)) {
            Template template = cfg.getTemplate(templateName);
            template.process(dataModel, writer);
        } catch (IOException | TemplateException e) {
            throw new RuntimeException("渲染模板到文件失败: " + outputFile.getAbsolutePath(), e);
        }
        try {
            FileUtils.formatPomFile(outputFile);
        } catch (Exception e) {
        }

    }
}
